#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/gpio.h>

#define GPIO_PIN 34 // 定义要使用的GPIO脚
#define GPIO_PULLUP 1 // 定义上拉

// 全局变量，用于存储按键状态
int buttonPressed = 0;

// 中断处理函数
void gpioisrhandler(int pin) {
    // 当GPIO脚的状态发生变化时，这个函数会被调用
    if (buttonPressed == 0) {
        buttonPressed = 1;
    } else {
        buttonPressed = 0;
    }
}

int main() {
    // 打开GPIO设备文件
    int fd = open("/dev/mem", O_RDWR);
    if (fd < 0) {
        perror("Error opening /dev/mem");
        exit(EXIT_FAILURE);
    }

    // 定位GPIO控制器
    void* gpio_addr = mmap(NULL, sysconf(_SC_PAGESIZE), PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_BASE_ADDRESS);
    if (gpio_addr == MAP_FAILED) {
        perror("Error mapping GPIO controller");
        exit(EXIT_FAILURE);
    }

    // 初始化GPIO结构体
    gpio_config_t ioconf;
    ioconf.pin_bitmask = (1ULL << GPIO_PIN); // 选择GPIO脚
    ioconf.mode = GPIO_MODE_INPUT; // 设置为输入模式
    ioconf.pullup_en = GPIO_PULLUP; // 使能上拉

    // 配置GPIO
    gpio_config(&ioconf);

    // 注册中断处理程序
    gpioinstallisrservice(ESPINTRFLAG_DEFAULT);
    gpioisrhandleradd(GPIO_PIN, gpioisrhandler, (void*) GPIO_PIN);

    // 主循环
    for (;;) {
        // 读取全局变量以获取按键状态
        if (buttonPressed == 1) {
            printf("Button pressed\n");
        } else {
            printf("Button released\n");
        }

        sleep(1); // 每秒检查一次按键状态
    }

    return 0;
}
